/**
 * @file gt_font.c
 * @author yongg
 * @brief
 * @version 0.1
 * @date 2022-06-01 11:22:22
 * @copyright Copyright (c) 2014-present, Company Genitop. Co., Ltd.
 */

/* include --------------------------------------------------------------*/
#include "gt_font.h"
#include "stdint.h"
#include "stdbool.h"
#include "../others/gt_log.h"
#include "../core/gt_mem.h"
/* private define -------------------------------------------------------*/

#define GT_CFG_USE_FONT_16_ASCII    01

/* Symbol */
#define GT_CFG_USE_SYMBOL_16x16     1

/* private typedef ------------------------------------------------------*/

/* static variables -----------------------------------------------------*/
static const uint8_t ascii_16[];
uint8_t latin_16x16_width[] = {
    // latin
    // 1.1:0x0020UL<=unicode<=0x007FUL
    0x04,  0x04,  0x08,  0x09,  0x09,  0x10,  0x0d,  0x04,  0x06,  0x05,  0x09,  0x09,  0x04,  0x06,  0x04,  0x05,  0x09,  0x07,  0x09,  0x09,  0x09,  0x09,  0x09,  0x09,  0x09,  0x09,  0x06,  0x06,  0x09,  0x09,  0x09,  0x0a,  0x10,  0x0c,  0x0c,  0x0c,  0x0c,  0x0b,  0x0a,  0x0c,  0x0c,  0x04,  0x09,  0x0c,  0x0a,  0x0d,  0x0c,  0x0c,  0x0b,  0x0c,  0x0d,  0x0b,  0x0b,  0x0c,  0x0c,  0x10,  0x0b,  0x0b,  0x0a,  0x06,  0x05,  0x06,  0x09,  0x0a,  0x04,  0x0a,  0x0a,  0x09,  0x0a,  0x09,  0x06,  0x0a,  0x0a,  0x04,  0x04,  0x09,  0x04,  0x0e,  0x0a,  0x0a,  0x0a,  0x0a,  0x07,  0x09,  0x06,  0x0a,  0x09,  0x0e,  0x09,  0x0a,  0x09,  0x07,  0x04,  0x07,  0x0a,
    // 1.2:0x00A0UL<=unicode<=0x017FUL
    0x04,  0x04,  0x09,  0x0a,  0x0a,  0x09,  0x04,  0x0a,  0x06,  0x0d,  0x06,  0x09,  0x09,  0x06,  0x0d,  0x0a,  0x06,  0x09,  0x06,  0x06,  0x05,  0x09,  0x0a,  0x04,  0x06,  0x05,  0x07,  0x09,  0x0e,  0x0d,  0x0e,  0x0a,  0x0c,  0x0c,  0x0c,  0x0c,  0x0c,  0x0c,  0x10,  0x0c,  0x0b,  0x0b,  0x0b,  0x0b,  0x04,  0x05,  0x05,  0x05,  0x0c,  0x0c,  0x0c,  0x0c,  0x0c,  0x0c,  0x0c,  0x08,  0x0d,  0x0c,  0x0c,  0x0c,  0x0c,  0x0b,  0x0b,  0x0a,  0x0a,  0x0a,  0x0a,  0x0a,  0x0a,  0x0a,  0x0e,  0x09,  0x09,  0x09,  0x09,  0x09,  0x04,  0x05,  0x05,  0x05,  0x0a,  0x0a,  0x0a,  0x0a,  0x0a,  0x0a,  0x0a,  0x09,  0x0a,  0x0a,  0x0a,  0x0a,  0x0a,  0x0a,  0x0a,  0x0a,  0x0c,  0x0a,  0x0c,  0x0a,  0x0c,  0x0a,  0x0c,  0x09,  0x0c,  0x09,  0x0c,  0x09,  0x0c,  0x09,  0x0c,  0x0d,  0x0c,  0x0b,  0x0b,  0x09,  0x0b,  0x09,  0x0b,  0x09,  0x0b,  0x09,  0x0b,  0x09,  0x0c,  0x0a,  0x0c,  0x0a,  0x0c,  0x0a,  0x0c,  0x0a,  0x0c,  0x0a,  0x0d,  0x0a,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x04,  0x04,  0x0d,  0x09,  0x0a,  0x05,  0x0c,  0x09,  0x0a,  0x0a,  0x05,  0x0a,  0x05,  0x0b,  0x07,  0x0a,  0x07,  0x0a,  0x05,  0x0c,  0x0a,  0x0c,  0x0a,  0x0c,  0x0a,  0x0c,  0x0c,  0x0a,  0x0c,  0x0a,  0x0c,  0x0a,  0x0c,  0x0a,  0x10,  0x0f,  0x0d,  0x07,  0x0d,  0x07,  0x0d,  0x07,  0x0b,  0x09,  0x0b,  0x09,  0x0b,  0x09,  0x0b,  0x09,  0x0a,  0x06,  0x0a,  0x09,  0x0b,  0x06,  0x0c,  0x0a,  0x0c,  0x0a,  0x0c,  0x0a,  0x0c,  0x0a,  0x0c,  0x0a,  0x0c,  0x0b,  0x10,  0x0e,  0x0b,  0x0a,  0x0b,  0x0a,  0x09,  0x0a,  0x09,  0x0a,  0x09,
    // 1.3:0x01A0UL<=unicode<=0x01CFUL
    0x0e,  0x0c,  0x0d,  0x0d,  0x0c,  0x09,  0x0d,  0x0b,  0x09,  0x0a,  0x08,  0x08,  0x0c,  0x07,  0x0c,  0x0e,  0x0d,  0x0e,  0x0c,  0x0a,  0x0c,  0x0b,  0x09,  0x0b,  0x0b,  0x09,  0x0a,  0x0b,  0x0a,  0x09,  0x09,  0x0a,  0x04,  0x05,  0x09,  0x04,  0x10,  0x10,  0x10,  0x10,  0x0d,  0x08,  0x10,  0x10,  0x0e,  0x0c,  0x0a,
    // 1.4:0x01F0UL<=unicode<=0x01FFUL
    0x07,  0x10,  0x10,  0x10,  0x0c,  0x0a,  0x10,  0x0b,  0x0c,  0x0a,  0x0c,  0x0a,  0x10,  0x0e,  0x0d,
    // 1.5:0x0210UL<=unicode<=0x021FUL
    0x0d,  0x07,  0x0d,  0x07,  0x0c,  0x0a,  0x0c,  0x0a,  0x0b,  0x09,  0x0b,  0x07,  0x0b,  0x08,  0x0c,
    // 1.6:0x1EA0UL<=unicode<=0x1EFFUL
    0x0c,  0x0a,  0x0c,  0x0a,  0x0c,  0x0b,  0x0c,  0x0a,  0x0c,  0x0b,  0x0c,  0x0a,  0x0c,  0x0a,  0x0c,  0x0a,  0x0c,  0x0a,  0x0c,  0x0a,  0x0c,  0x0a,  0x0c,  0x0a,  0x0b,  0x09,  0x0b,  0x09,  0x0b,  0x09,  0x0c,  0x0b,  0x0b,  0x09,  0x0d,  0x0c,  0x0b,  0x09,  0x0b,  0x09,  0x05,  0x05,  0x04,  0x04,  0x0c,  0x0a,  0x0c,  0x0a,  0x0d,  0x0c,  0x0c,  0x0a,  0x0d,  0x0c,  0x0c,  0x0a,  0x0c,  0x0a,  0x0c,  0x0b,  0x0d,  0x0b,  0x0d,  0x0b,  0x0d,  0x0b,  0x0c,  0x0a,  0x0c,  0x0a,  0x0c,  0x0a,  0x0c,  0x0c,  0x0c,  0x0c,  0x0c,  0x0c,  0x0c,  0x0c,  0x0c,  0x0c,  0x0b,  0x0a,  0x0b,  0x0a,  0x0b,  0x0a,  0x0b,  0x0a,  0x0a,  0x0a,  0x0a,  0x0a,  0x0a,
};


/* macros ---------------------------------------------------------------*/
static gt_encoding_et _gt_project_encoding = GT_ENCODING_UTF8;


/* static functions -----------------------------------------------------*/

/**
 * @brief get idx in unicode_arr by unicode (for )
 *
 * @param unicode_arr
 * @param depth
 * @param unicode
 * @return uint32_t
 */
static uint32_t __get_idx(uint32_t * unicode_arr, uint8_t depth, uint32_t unicode)
{
    uint8_t idx = 0;
    while( idx < depth ){
        if( unicode >= unicode_arr[idx << 2] && unicode <= unicode_arr[(idx << 2) + 1] ){
            idx += unicode - unicode_arr[idx << 2];
            break;
        }else{
            idx += unicode_arr[(idx << 2) + 1] - unicode_arr[idx << 2];
        }
    }
    return idx;
}


/**
 * @brief check unicode is latin
 *
 * @param unicode unicode
 * @return true :the unicode is latin
 * @return false :the unicode not is latin
 */
static bool _gt_font_latin_check(uint32_t unicode)
{
    uint32_t code[] = {
        //start     end
        0x0020UL, 0x007FUL,
        0x00A0UL, 0x017FUL,
        0x01A0UL, 0x01CFUL,
        0x01F0UL, 0x01FFUL,
        0x0210UL, 0x021FUL,
        0x1EA0UL, 0x1EFFUL,
    };
    bool res = false;
    for(int i=0; i<6; i++){
        if( unicode >= code[i<<1] && unicode <= code[(i<<1)+1] ){
            res = true;
        }
    }
    return res;
}



/**
 * @brief get one latin word width
 *
 * @param unicode latin unicode
 * @param font_size font size
 * @return uint8_t the latin unicode font width
 */
static uint8_t _gt_font_latin_get_width(uint32_t unicode, uint8_t font_size)
{
    uint32_t code[] = {
        //start     end
        0x0020UL, 0x007FUL,
        0x00A0UL, 0x017FUL,
        0x01A0UL, 0x01CFUL,
        0x01F0UL, 0x01FFUL,
        0x0210UL, 0x021FUL,
        0x1EA0UL, 0x1EFFUL,
    };
    uint32_t idx = __get_idx(code, 6, unicode);
    uint8_t width = font_size;
    switch( font_size ){
        case 16:
            width = latin_16x16_width[idx];
            break;
        case 24:
            break;
        default:
            break;
    }
    return width;

}

uint8_t _gt_gb_font_one_char_code_len_get(uint8_t const * const utf8, uint32_t *res)
{
    if(NULL == utf8 ) return 0;

    int len = strlen((char * )utf8);

    if(len >= 1 && utf8[0] <= 0x7F){
        if(res){
            *res = utf8[0];
        }
        return 1;
    }
    else if( len >=4 && \
    (((utf8[0] << 8 | utf8[1]) == 0x8139) || ((utf8[0] << 8 | utf8[1]) >= 0x8230 && (utf8[0] << 8 | utf8[1]) <= 0x8235))
    )
    {
        if(res){
            *res = utf8[0] << 24 | utf8[1] << 16 | utf8[2] << 8 | utf8[3] << 0;
        }
        return 4;
    }
    else if(len >= 2){
        if(res){
            *res = utf8[0] << 8 | utf8[1] << 0;
        }
        return 2;
    }

    return len;
}

/**
 * @brief unicode encoding convert to utf-8 encoding
 *
 * @param utf8 utf-8 encoding
 * @param unicode unicode encoding
 * @return uint8_t THe number length bytes of utf-8 encoding
 */
uint8_t gt_unicode_to_utf8(uint8_t* utf8 , uint32_t unicode)
{
    if(NULL == utf8){
        return 0;
    }

    if(unicode <= 0x007FUL){
        *utf8 = (unicode & 0x7F);
        return 1;
    }
    else if( unicode >= 0x0080UL && unicode <= 0x07FFUL ){
        *(utf8+1) = (unicode & 0x3F) | 0x80;
        *utf8     = ((unicode >> 6) & 0x1F) | 0xC0;
        return 2;
    }
    else if ( unicode >= 0x0800UL && unicode <= 0xFFFFUL )
    {
        *(utf8+2) = (unicode & 0x3F) | 0x80;
        *(utf8+1) = ((unicode >>  6) & 0x3F) | 0x80;
        *utf8     = ((unicode >> 12) & 0x0F) | 0xE0;
        return 3;
    }
    else if ( unicode >= 0x00010000  && unicode <= 0x001FFFFF ){
        *(utf8+3) = (unicode & 0x3F) | 0x80;
        *(utf8+2) = ((unicode >>  6) & 0x3F) | 0x80;
        *(utf8+1) = ((unicode >> 12) & 0x3F) | 0x80;
        *utf8     = ((unicode >> 18) & 0x07) | 0xF0;
        return 4;
    }
    else if ( unicode >= 0x200000UL && unicode <= 0x3FFFFFFUL )
    {
        *(utf8+4) = (unicode & 0x3F) | 0x80;
        *(utf8+3) = ((unicode >>  6) & 0x3F) | 0x80;
        *(utf8+2) = ((unicode >> 12) & 0x3F) | 0x80;
        *(utf8+1) = ((unicode >> 18) & 0x3F) | 0x80;
        *utf8     = ((unicode >> 24) & 0x03) | 0xF8;
        return 5;
    }
    else if ( unicode >= 0x4000000UL && unicode <= 0x7FFFFFFFUL )
    {
        *(utf8+5) = (unicode & 0x3F) | 0x80;
        *(utf8+4) = ((unicode >>  6) & 0x3F) | 0x80;
        *(utf8+3) = ((unicode >> 12) & 0x3F) | 0x80;
        *(utf8+2) = ((unicode >> 18) & 0x3F) | 0x80;
        *(utf8+1) = ((unicode >> 24) & 0x3F) | 0x80;
        *utf8     = ((unicode >> 30) & 0x01) | 0xFC;
        return 6;
    }
    return 0;
}


uint8_t _gt_utf8_to_unicode(uint8_t * utf8,uint32_t *res)
{
	if (utf8[0] < 0x80) {
		*res = utf8[0];
		return 1;
	} else if (utf8[0] < 0xE0) {
		*res = ((utf8[0] & 0x1F) << 6) | (utf8[1] & 0x3F);
		return 2;
	} else if (utf8[0] < 0xF0) {
		*res = ((utf8[0] & 0x0F) << 12) | ((utf8[1] & 0x3F) << 6) | (utf8[2] & 0x3F);
		return 3;
	} else if (0xF0 == (utf8[0] & 0xF0)) {
		*res = ((utf8[0] & 0x07) << 18) | ((utf8[1] & 0x3F) << 12) | ((utf8[2] & 0x3F) << 6) | (utf8[3] & 0x3F);
		return 4;
	}
	return 0;
}


uint8_t gt_font_one_char_code_len_get(uint8_t * utf8,uint32_t *res , uint8_t encoding)
{
#if GT_CFG_ENABLE_ZK_FONT == 1
    GT_Set_Chinese_Charset_Type(encoding);
#endif
    if(GT_ENCODING_UTF8 == encoding)
    {
        return _gt_utf8_to_unicode(utf8 , res);
    }
    else if(GT_ENCODING_GB == encoding)
    {
        return _gt_gb_font_one_char_code_len_get(utf8 , res);
    }

    return 0;
}

uint8_t gt_encoding_table_one_char(uint8_t *src ,uint8_t* dst , gt_encoding_convert_et tab )
{
    uint32_t fontcode , len = 0;
#if GT_CFG_ENABLE_ZK_FONT == 1
    if(UTF8_2_GB == tab)
    {
        // utf8_to_unicode
        len = _gt_utf8_to_unicode(src , &fontcode);
        // unicode to gb
        fontcode = UnicodeToGBK(fontcode);
        int tmp_len = _gt_gb_font_one_char_code_len_get((uint8_t*)src , NULL);
        int tmp_i = 0;
        for(tmp_i = 0; tmp_i < tmp_len; tmp_i++)
        {
            dst[tmp_len -1 - tmp_i] = fontcode >> (tmp_i*8);
        }
    }
    else if(GB_2_UTF8 == tab)
    {
        len = _gt_gb_font_one_char_code_len_get(src , &fontcode);
        // gb to unicode
        fontcode =  GBKToUnicode(fontcode);
        // unicode to utf8
        gt_unicode_to_utf8(dst , fontcode);
    }
#endif
    return len;
}


uint8_t gt_utf8_check_char(uint8_t * utf8)
{
    uint32_t len = strlen((char * )utf8);

    if(len >= 1 && utf8[0] < 0x80){
        return 1;
    }
    if(len >=2 && (utf8[0] >> 5) == 0x06){
        return 2;

    }
    if(len >=3 && (utf8[0] >> 4) == 0x0E){
        return 3;

    }
    if(len >=4 && (utf8[0] >> 3) == 0x1E){
        return 4;

    }
    if(len >=5 && (utf8[0] >> 2) == 0x3E){
        return 5;

    }
    if(len >=6 && (utf8[0] >> 1) == 0x7E){
        return 6;
    }

    return 0;
}

uint8_t gt_gb_check_char(const uint8_t *dst , uint16_t pos , uint32_t* fontcode)
{

    if(NULL == dst) return 0;
    uint16_t pos_s = 0 ,len = 0 , idx = 0 , str_len = 0;

    str_len = strlen((char * )dst);
    while (idx < str_len)
    {
        len = _gt_gb_font_one_char_code_len_get(&dst[idx], fontcode);

        if(idx == pos)
        {
            return len;
        }
        if(pos >= pos_s && pos < idx+len)
        {
            return len;
        }
        pos_s = idx;
        idx+=len;
    }

    return 0;
}

/**
 * @brief 判断编码是外文（style_en）还是中日韩(style_cn)
 *
 * @param unicode unicode编码
 * @return int 0 - style_cn  else-style_en
 */
gt_font_style_en_cn_et _gt_is_style_cn_or_en(uint32_t unicode , uint8_t encoding)
{
    if(GT_ENCODING_GB == encoding)
    {
        if(unicode <= 0x7F)
        {
            return STYLE_EN_ASCII;
        }
        return STYLE_CN;
    }
    // ascii
    // if(unicode >= 0x20 && unicode <= 0x7F)
    if(unicode <= 0x7F)
    {
        return STYLE_EN_ASCII;
    }
    // latin
    else if(  (unicode >= 0x0080 && unicode <= 0x024F)
            ||(unicode >= 0x1E00 && unicode <= 0x1EFF)
            )
    {
        return STYLE_EN_LATIN;
    }
    // greek and coptic
    else if(unicode >= 0x0370 && unicode <= 0x03FF)
    {
        return STYLE_EN_GREEK;
    }
    // cyrillic
    else if(unicode >= 0x0400 && unicode <= 0x04FF)
    {
        return STYLE_EN_CYRILLIC;
    }
    // hebrew
    else if(unicode >= 0x0590 && unicode <= 0x05FF)
    {
        return STYLE_EN_HEBREW;
    }
    // arabic
    else if(  (unicode >= 0x0600 && unicode <= 0x06FF)
            ||(unicode >= 0xFB50 && unicode <= 0xFDFF)
            ||(unicode >= 0xFE70 && unicode <= 0xFEFF)
            )
    {
        return STYLE_EN_ARABIC;
    }
    // thai
    else if(unicode >= 0x0E00 && unicode <= 0x0E7F)
    {
        return STYLE_EN_THAI;
    }
    // hindi
    else if(unicode >=0x0900 && unicode<=0x097F)
    {
        return STYLE_EN_HINDI;
    }
    // Currency Symbols
    else if(0x20AC == unicode ) // || 0xFFE5 == unicode)
    {
        return STYLE_EN_Currency;
    }

    return STYLE_CN;
}

bool gt_style_en_data_is_convertor(uint32_t unicode , uint8_t encoding)
{
    gt_font_style_en_cn_et style_laug = _gt_is_style_cn_or_en(unicode , encoding);

    switch(style_laug)
    {
        // case STYLE_EN_HEBREW:
        case STYLE_EN_ARABIC:
        case STYLE_EN_THAI:
        case STYLE_EN_HINDI:
            return true;
        default:
            break;
    }
    return false;
}

bool is_convertor_language(gt_font_style_en_cn_et style_laug)
{
    switch(style_laug)
    {
        // case STYLE_EN_HEBREW:
        case STYLE_EN_ARABIC:
        case STYLE_EN_THAI:
        case STYLE_EN_HINDI:
            return true;
        default:
            break;
    }
    return false;
}

static bool _gt_number_symbol_font(uint32_t unicode)
{
    // 0123456789,.:'$€￥
    if( unicode >= 0x30 && unicode <= 0x39 || \
        0x3A == unicode || 0x2C == unicode || 0x2E == unicode || \
        0x27 == unicode || 0x24 == unicode || 0xFFE5 == unicode || 0x20AC == unicode \
    ){
        return true;
    }

    return false;
}

static uint32_t _get_font_style(gt_font_st *font , uint32_t unicode)
{
    gt_font_style_en_cn_et style_type = 0;
    uint32_t font_style ;
    if(GT_CFG_DEFAULT_FONT_FAMILY_NUMB != font->info.style_numb && _gt_number_symbol_font(unicode)){
        font_style = font->info.style_numb;
    }
    else{
        style_type = _gt_is_style_cn_or_en(unicode , font->info.encoding);
        if(STYLE_CN == style_type){
            font_style = font->info.style_cn;
        }
        else if(STYLE_EN_ASCII == style_type){
            font_style = font->info.style_en;
        }
        else{
            font_style = font->info.style_fl;
        }
    }
    return font_style;

}
/* global functions / API interface -------------------------------------*/


uint16_t gt_font_get_string_dot(gt_font_st * font)
{
    uint32_t idx = 0, unicode, len, font_style = 0, idx_read = 0, temp = 0;
    uint16_t ret = GT_FONT_TYPE_FLAG_NONE;

    // GT_LOGV(GT_LOG_TAG_GUI, "text:%s", font->utf8);
    while(idx < font->len) {
        // len = _gt_utf8_to_unicode(&font->utf8[idx], &unicode);
        len = gt_font_one_char_code_len_get((uint8_t * )&font->utf8[idx], &unicode , font->info.encoding);

#if GT_CFG_ENABLE_ZK_FONT == 1
        struct gt_font_func_s* font_func;

        font_style = _get_font_style(font , unicode);

        font_func = GT_Get_Font_Func_S(font_style);
        if(!font_func)
        {
            goto default_font;
        }
        if(!GT_Check_Is_Vec(font_style))
        {
            // 点阵
            if(!font_func->func.read_dot_font)
            {
                idx+=len;
                continue;
            }
            temp = font_func->func.read_dot_font(unicode , font_style , &font->res[idx_read]);
            if(temp == 0)
            {
                idx+=len;
                continue;
            }
            ret = font_func->type;
            goto lab_next_word;
        }
        else
        {
            // 矢量
            if(!font_func->func.read_vec_font)
            {
                idx+=len;
                continue;
            }
            temp = font_func->func.read_vec_font(&font->res[idx_read], font_style , unicode , font->info.size , font->info.gray , \
                                                font_style==font->info.style_cn ? font->info.thick_cn : font->info.thick_en);
            if(temp == 0)
            {
                idx+=len;
                continue;
            }
            ret = font_func->type;
            goto lab_next_word;
        }
#endif

default_font:
        font_style = _gt_is_style_cn_or_en(unicode , font->info.encoding);
        if(1 == font_style)
        {
#if GT_CFG_USE_FONT_16_ASCII == 1
            temp = 32;
            gt_memcpy(&font->res[idx_read], &ascii_16[ (unicode-0x20)<<5 ], 32);
            ret = GT_FONT_TYPE_FLAG_DOT_MATRIX_NON_WIDTH;
#endif
        }
lab_next_word:
        idx_read += temp;
        idx+=len;
    }
    return ret;
}

uint8_t gt_font_type_get(unsigned int style)
{
#if GT_CFG_ENABLE_ZK_FONT == 1
    return GT_Get_Font_Type(style);
#else
    return 0;
#endif
}

int gt_font_code_transform(font_convertor_st *convert)
{
unsigned int len = 0;
#if GT_CFG_ENABLE_ZK_FONT == 1
    struct gt_font_func_s* font_func;
    font_func = GT_Get_Font_Func_S(convert->font_option);

    if(NULL == font_func){
        return len;
    }

    if(GT_Check_Is_Vec(convert->font_option)){
        convert->read_vec_font = font_func->func.read_vec_font;
    }
    else
    {
        convert->read_dot_font = font_func->func.read_dot_font;
    }

    len = GT_Font_Code_Transform(convert);
#endif
    return len;
}

int gt_font_convertor_data_get(font_convertor_st *convert , uint32_t pos)
{
#if GT_CFG_ENABLE_ZK_FONT == 1
    return GT_Get_Font_Convertor_Data(convert , pos);
#else
    return 0;
#endif
}


uint32_t gt_font_get_string_width(gt_font_st * font)
{
	uint32_t idx = 0, unicode = 0, width = 0 , tmp = 0;

    while( idx < font->len ){
        //  idx += _gt_utf8_to_unicode(&font->utf8[idx], &unicode);
        idx += gt_font_one_char_code_len_get((uint8_t * )&font->utf8[idx], &unicode, font->info.encoding);
        width += gt_font_get_one_word_width(unicode , font);
    }
    return width;
}


uint8_t gt_font_get_one_word_width(uint32_t unicode, gt_font_st * font)
{
    if(unicode == 0x20){
        return font->info.size >> 1;
    }

#if GT_CFG_ENABLE_ZK_FONT == 1
    int width = 0;
    int option = 0;

    option = _get_font_style(font , unicode);

    if(GT_Check_Is_Vec(option)){
        uint32_t font_dot_w = (((font->info.size + 15) >> 4) << 4) * font->info.gray;
        font_dot_w = (font_dot_w*font_dot_w) >> 3;
        gt_memset(font->res , 0 , font_dot_w);
    }

    width = GT_Get_Font_Width(unicode , option , font->info.size , font->info.gray , font->res);

    if(0 == width){
        if(_gt_font_latin_check(unicode)) {
            return _gt_font_latin_get_width(unicode , font->info.size);
        }
        return font->info.size;
    }
    return width;
#else
    if(_gt_font_latin_check(unicode))
    {
        return _gt_font_latin_get_width(unicode , font->size);
    }
    return font->size;
#endif

}

uint8_t gt_font_get_next_word_width(gt_font_st * font, uint8_t is_head){
    static uint16_t idx = 0;
    uint16_t i = 0, idx_utf8 = 0;
    uint32_t unicode = 0;
    if(is_head){
        idx = 0;
    }
    while( i <= idx ){
        // idx_utf8 += _gt_utf8_to_unicode((uint8_t *)&font->utf8[idx_utf8], &unicode);
        idx_utf8 += gt_font_one_char_code_len_get((uint8_t *)&font->utf8[idx_utf8], &unicode, font->info.encoding);
        i++;
    }
    idx++;
    return gt_font_get_one_word_width(unicode, font);
}

/**
 * @brief 得到灰度文字的宽度
 *
 * @param data 文字数据
 * @param dot_w 文字宽度    例如：48x48大小的文字 dot_w = 48
 * @param dot_h 文字高度 	例如：48x48大小的文字 dot_h = 48
 * @param gray 取值: 1 / 2 / 4
 * @return int 实际文字宽度
 */
uint16_t gt_font_get_word_width_figure_up(const uint8_t* data , uint16_t dot_w , uint16_t dot_h , uint8_t gray)
{
	uint16_t byte_w , i ;
	int j  ,len ;
	uint8_t tmp = 0;

	// if(gray < 1 || gray > 4){
	// 	return dot_w;
	// }

    byte_w = ((dot_w + 7) >> 3) * gray;

	for(j = byte_w-1;j >= 0 ; j--)
	{
		tmp = 0;
		for(i = 0 ; i < dot_h ; i++)
		{
			tmp |= data[i*byte_w + j];
		}
		if(0 != tmp)
		{
			for(i = 0 ; i < 8 ;i++){
				if((tmp >> i)&0x01){
					break;
				}
			}

            len = ((j / gray) * 8) + ((j%gray)*8+(8-i))/gray;
            // GT_LOGD( GT_LOG_TAG_GUI, "[%d] byte_w = %d , tmp = 0x%02X , len = %d , i = %d , gray = %d , dot_w = %d\r\n", j , byte_w , tmp , len, i , gray , dot_w);

            //
            if(len >= dot_h){
                continue;
            }

			return len ;
		}
	}

	return dot_w;
}





void gt_dot_to_mask_buf(uint8_t * dot, uint8_t * mask_buf, uint16_t w, uint16_t h){

}


void gt_project_encoding_set(gt_encoding_et charset)
{
    _gt_project_encoding = charset;
}

gt_encoding_et gt_project_encoding_get(void)
{
    return _gt_project_encoding;
}

static uint32_t _gt_font_language_split(const uint8_t *str , uint32_t len , uint8_t encoding , uint8_t *lan)
{
    uint32_t idx = 0 ,tmp, unicode ;
    idx += gt_font_one_char_code_len_get((uint8_t * )&str[0], &unicode, encoding);
    if(idx == 0){
        return 0;
    }
    *lan = _gt_is_style_cn_or_en(unicode , encoding);

    while (idx < len)
    {
        /* code */
        tmp = gt_font_one_char_code_len_get((uint8_t * )&str[idx], &unicode, encoding);
        if(*lan != _gt_is_style_cn_or_en(unicode , encoding)){
            break;
        }
        idx += tmp;
    }

    return idx;
}

static uint32_t _gt_font_punctuation_split(const uint8_t *str , uint32_t len , uint8_t encoding)
{
    uint32_t idx = 0 , unicode = 0;
    uint8_t tmp;
    idx += gt_font_one_char_code_len_get((uint8_t * )&str[idx], &unicode, encoding);
    if(0x20 == unicode){
        return idx;
    }
    while (idx < len)
    {
        tmp = gt_font_one_char_code_len_get((uint8_t * )&str[idx], &unicode, encoding);
        if(0x20 == unicode || '\n' == unicode){
            break;
        }
        idx += tmp;
    }

    return idx;
}

static uint32_t _gt_font_cn_in_this_range(const gt_font_st *fonts , uint32_t width , uint32_t space , uint32_t* ret_w)
{

    uint32_t idx = 0 , unicode = 0 , w = 0 ;
    uint8_t *str = fonts->utf8 , tmp ,  tmp_w = 0;

    while (idx < fonts->len)
    {
        tmp = gt_font_one_char_code_len_get((uint8_t * )&str[idx], &unicode, fonts->info.encoding);
        tmp_w = gt_font_get_one_word_width(unicode, (gt_font_st*)fonts);

        if(w + tmp_w > width){
            break;
        }

        w += tmp_w + space;
        idx += tmp;
    }
    *ret_w = w;
    return idx;
}

static uint32_t _gt_font_en_in_this_range(const gt_font_st *fonts , uint32_t width , uint32_t space , uint32_t* ret_w , uint16_t *ol_idx , uint16_t *ol_width)
{

    uint32_t idx = 0 , unicode = 0 , w = 0 ;
    uint8_t *str = fonts->utf8 , tmp , tmp_w = 0;
    if(NULL != ol_width){
        *ol_width = 0;
    }
    if(NULL != ol_idx){
        *ol_idx = 0;
    }
    while (idx < fonts->len)
    {
        tmp = gt_font_one_char_code_len_get((uint8_t * )&str[idx], &unicode, fonts->info.encoding);
        tmp_w = gt_font_get_one_word_width(unicode, (gt_font_st*)fonts);

        if(w < width){
            if(NULL != ol_width){
                *ol_width = w;
            }
            if(NULL != ol_idx){
                *ol_idx = idx;
            }
        }

        w += tmp_w + space;
        idx += tmp;
    }
    *ret_w = w;
    return idx;
}

static uint32_t _get_convertor_string_width(const gt_font_st *fonts , uint8_t lan , uint32_t space , uint16_t range_w, uint16_t *ol_idx , uint16_t *ol_width)
{
    uint32_t idx = 0 , unicode , tmp , len = fonts->info.size * fonts->len;
    uint16_t *text = NULL;
    uint8_t *font_buf = NULL;
    text = (uint16_t*)gt_mem_malloc(fonts->len * sizeof(uint16_t));
    if(NULL == text){
        GT_LOGE(GT_LOG_TAG_GUI, "buf malloc failed , size: %d" , fonts->len * sizeof(uint16_t));
        goto _ret_handle;
    }

    if(NULL != ol_width){
        *ol_width = 0;
    }
    if(NULL != ol_idx){
        *ol_idx = 0;
    }

    gt_font_st _font = {
        .info = fonts->info,
        .utf8 = fonts->utf8,
        .len = fonts->len,
        .res = NULL,
    };

    tmp = 0;
    while (idx < _font.len)
    {
        idx += gt_font_one_char_code_len_get((uint8_t * )&_font.utf8[idx], &unicode, _font.info.encoding);
        text[tmp++] = (uint16_t)unicode;
    }
    uint16_t text_len = tmp , width;
    uint8_t ret_style;
    uint32_t dot_w , font_buf_len , one_font_size = 0;
    ret_style = gt_font_type_get(_font.info.style_fl);
    if(ret_style == GT_FONT_TYPE_FLAG_VEC){
        dot_w = (((_font.info.size * _font.info.gray + 15) >> 4) << 4);
    }
    else{
        dot_w = (((_font.info.size + 7) >> 3) << 3);
    }

    if(STYLE_EN_HINDI == lan){
        one_font_size = 48;
        font_buf_len = one_font_size * (text_len + 1);
    }
    else{
        one_font_size = dot_w * dot_w >> 3;
        if(GT_FONT_TYPE_FLAG_DOT_MATRIX_NON_WIDTH == ret_style){
            one_font_size += 2;
        }
        font_buf_len = one_font_size * 3;
    }

    if(_font.info.gray != 1){
        dot_w = ((dot_w / _font.info.gray) + 7 ) >> 3 << 3;
    }

    font_buf = (uint8_t*)gt_mem_malloc(font_buf_len);
    if(NULL == font_buf){
        GT_LOGE(GT_LOG_TAG_GUI, "buf malloc failed , size: %d" , font_buf_len);
        goto _ret_handle;
    }
    gt_memset_0(font_buf , font_buf_len);

    font_convertor_st convertor = {
        .fontcode = text ,
        .code_len = text_len ,
        .fontsize = _font.info.size ,
        .fontgray = _font.info.gray ,
        .font_option = _font.info.style_fl ,
        .thick = _font.info.thick_en,
        .data = font_buf ,
        .data_len = font_buf_len ,
        .is_rev = 1,
        .is_vec = ret_style == GT_FONT_TYPE_FLAG_VEC ? 1 : 0 ,
    };

    text_len = gt_font_code_transform(&convertor);

    idx = 0;
    tmp = 0;
    len = 0;
    _font.res = &font_buf[font_buf_len - one_font_size];
    while (idx < text_len)
    {
        if(STYLE_EN_HINDI == lan){
            width = gt_font_get_word_width_figure_up(&convertor.data[idx * one_font_size] , 16 , 24 , 1);
            tmp = 1;
        }
        else{
            gt_memset_0(&convertor.data[0] , font_buf_len);

            if(0x20 == convertor.fontcode[idx]){
                width = convertor.fontsize >> 1;
            }
            else{
                tmp = gt_font_convertor_data_get(&convertor , idx);

                width = gt_font_get_word_width_figure_up(&convertor.data[0] , dot_w , convertor.fontsize , convertor.fontgray);
            }
        }


        if(len < range_w && lan != STYLE_EN_ARABIC){
            if(NULL != ol_width){
                *ol_width = len;
            }
            if(NULL != ol_idx){
                *ol_idx = idx*3;
            }
        }

        len += width + space;
        idx += tmp;
    }

_ret_handle:
    if(NULL !=text){
        gt_mem_free(text);
        text = NULL;
    }
    if(NULL != font_buf){
        gt_mem_free(font_buf);
        font_buf = NULL;
    }
    return len;
}

/* */
uint32_t gt_font_split(gt_font_st *fonts , uint32_t width , uint32_t dot_w ,uint32_t space , uint32_t *ret_w , uint8_t *lan , uint32_t* lan_len)
{
    uint32_t idx = 0 , len = 0;
    uint32_t tmp_len = 0 , tmp_w = 0;

    *ret_w = 0;
    *lan_len = 0;
    //
    len = _gt_font_language_split((const uint8_t*)fonts->utf8, fonts->len , fonts->info.encoding , lan);

    if(0 == len){
        return 0;
    }

    gt_font_st _font = {
        .info = fonts->info,
        .utf8 = fonts->utf8,
        .len = len,
        .res = fonts->res,
    };

    if(*lan == STYLE_CN){
        len = _gt_font_cn_in_this_range(&_font , width , space , ret_w);
        goto _ret_dat;
    }
    uint8_t *text = fonts->utf8;
    idx = 0;
    *ret_w = 0;
    *lan_len = len;
    uint16_t ol_w = 0 , ol_idx = 0;
    while (idx < len)
    {
        //
        tmp_len = _gt_font_punctuation_split((const uint8_t*)&text[idx] , len - idx, fonts->info.encoding);
        _font.utf8 = &text[idx];
        _font.len = tmp_len;
        //
        if(is_convertor_language(*lan)){
            tmp_w = _get_convertor_string_width(&_font , *lan , space , width - *ret_w, &ol_idx , &ol_w);
        }
        else
        {
            // tmp_w = gt_font_get_string_width(&_font);
            _gt_font_en_in_this_range(&_font , (width - (*ret_w)) , space , &tmp_w , &ol_idx , &ol_w );
        }

        if((*ret_w + tmp_w > width) || (0x0A == _font.utf8[0])){
            if(0 == idx && width == dot_w){
                len = ol_idx;
                *ret_w = ol_w;
            }
            else{
                len = idx;
            }
            break;
        }
        *ret_w += tmp_w;
        idx += tmp_len;
    }

_ret_dat:
    return len;
}


static bool _is_punctuation(uint32_t unicode)
{
    if( (0x20 <= unicode && unicode <= 0x2E) || \
        (0x3A <= unicode && unicode <= 0x40) || \
        (0x5B <= unicode && unicode <= 0x60) || \
        (0x7B <= unicode && unicode <= 0x7E)
    ){
        return true;
    }
    return false;
}

static uint32_t _gt_font_lang_and_punctuation_split(const uint8_t *str , uint32_t len , uint8_t encoding , uint8_t *lan , uint8_t is_lan)
{
    uint32_t idx = 0 ,tmp, unicode ;
    idx += gt_font_one_char_code_len_get((uint8_t * )&str[0], &unicode, encoding);
    if(idx == 0){
        return 0;
    }
    *lan = _gt_is_style_cn_or_en(unicode , encoding);
    if(_is_punctuation(unicode)){
        *lan = is_lan;
    }
    uint8_t tmp_lan;
    while (idx < len)
    {
        /* code */
        tmp = gt_font_one_char_code_len_get((uint8_t * )&str[idx], &unicode, encoding);
        tmp_lan = _gt_is_style_cn_or_en(unicode , encoding);
        if( (*lan != is_lan) && _is_punctuation(unicode)){
            break;
        }
        else if((!_is_punctuation(unicode)) && tmp_lan != *lan){
            break;
        }
        idx += tmp;
    }
    return idx;
}

uint8_t right_to_left_lan_get(uint16_t style)
{
    switch (style)
    {
    case 71:
    case 72:
    case 73:
    case 141:
        return STYLE_EN_HEBREW;

    case 74:
    case 75:
    case 76:
        return STYLE_EN_ARABIC;

    default:
        break;
    }

    return 0xFF;
}

bool gt_right_to_left_handler(const gt_font_st* fonts , uint8_t* ret_text , uint8_t r2l_lan)
{
    //
    uint32_t tmp = 0, unicode = 0 , len = 0 , alb_count = 0 ;
    int bidi_s = -1 , bidi_e = -1 , idx = 0;
    uint8_t lan;
    bool ret_flag = false;

    while (idx < fonts->len)
    {
        if(r2l_lan == STYLE_EN_ARABIC){
            len = _gt_font_language_split(&fonts->utf8[idx], fonts->len-idx , fonts->info.encoding , &lan);
        }
        else{
            len = _gt_font_lang_and_punctuation_split(&fonts->utf8[idx] , fonts->len-idx , fonts->info.encoding , &lan , r2l_lan);
        }
        if(r2l_lan == lan){
            ret_flag = true;
            if(-1 == bidi_s){
                bidi_s = tmp;
            }
            bidi_e = tmp;
        }
        idx+= len;
        ++tmp;
    }
    if(!ret_flag){
        return ret_flag;
    }

    uint16_t bidi_len = tmp;
    gt_bidi_st* bidi = (gt_bidi_st*)gt_mem_malloc((bidi_len * sizeof(gt_bidi_st)));
    if(NULL == bidi){
        GT_LOGE(GT_LOG_TAG_GUI , "bidi malloc err! size = %d" , (bidi_len * sizeof(gt_bidi_st)) );
        return false;
    }
    tmp = 0;
    idx = 0;
    while (idx < fonts->len)
    {
        if(r2l_lan == STYLE_EN_ARABIC){
            len = _gt_font_language_split(&fonts->utf8[idx], fonts->len-idx , fonts->info.encoding , &lan);

        }
        else{
            len = _gt_font_lang_and_punctuation_split(&fonts->utf8[idx] , fonts->len-idx , fonts->info.encoding , &lan , r2l_lan);
        }

        bidi[tmp].idx = idx;
        bidi[tmp].len = len;
        bidi[tmp].flag = (r2l_lan == lan) ? true : false;
        alb_count += (r2l_lan == lan || (1 == len && _is_punctuation(fonts->utf8[idx]))) ? 1 : 0;
        idx+= len;
        tmp++;
    }
    gt_bidi_st tmp_bidi;

    while(bidi_s < bidi_e)
    {
        if(r2l_lan == STYLE_EN_ARABIC && bidi_len != alb_count){
            break;
        }
        tmp_bidi = bidi[bidi_s];
        bidi[bidi_s] = bidi[bidi_e];
        bidi[bidi_e] = tmp_bidi;
        ++bidi_s;
        --bidi_e;
    }

    idx = 0;
    for(tmp = 0 ; tmp < bidi_len ; ++tmp)
    {
        if(false == bidi[tmp].flag || r2l_lan == STYLE_EN_ARABIC){
            gt_memcpy(&ret_text[idx] , &fonts->utf8[bidi[tmp].idx] ,bidi[tmp].len);
            idx += bidi[tmp].len;
            continue;
        }
        bidi_s = bidi[tmp].idx;
        bidi_e = 0;
        while(bidi_e < bidi[tmp].len)
        {
            len = gt_font_one_char_code_len_get((uint8_t * )&fonts->utf8[bidi_s], &unicode, fonts->info.encoding);
            gt_memcpy(&ret_text[idx + (bidi[tmp].len - bidi_e) - len] , &fonts->utf8[bidi_s] ,len);
            bidi_e += len;
            bidi_s += len;
        }
        idx += bidi[tmp].len;
    }

    if(NULL != bidi){
        gt_mem_free(bidi);
        bidi = NULL;
    }

    return ret_flag;
}



#if GT_CFG_USE_FONT_16_ASCII == 1
static const uint8_t ascii_16[] = {
    //
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //!
    0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,
    //"
    0x00,0x00,0x66,0x00,0x66,0x00,0x66,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //#
    0x00,0x00,0x00,0x00,0x1B,0x00,0x1B,0x00,0x1B,0x00,0x7F,0x00,0x7F,0x00,0x36,0x00,0x36,0x00,0x7F,0x00,0x7F,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x00,0x00,
    //$
    0x00,0x00,0x08,0x00,0x1C,0x00,0x3E,0x00,0x6B,0x00,0x68,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x6B,0x00,0x6B,0x00,0x3E,0x00,0x1C,0x00,0x08,0x00,0x00,0x00,
    //%
    0x00,0x00,0x00,0x00,0x78,0x30,0xCC,0x70,0xCC,0x60,0xCC,0xC0,0xCD,0xC0,0x79,0x80,0x03,0x3C,0x03,0x66,0x06,0x66,0x0E,0x66,0x1C,0x66,0x18,0x3C,0x00,0x00,0x00,0x00,
    //&
    0x00,0x00,0x00,0x00,0x1F,0x00,0x3F,0x80,0x31,0x80,0x31,0x80,0x1F,0x00,0x1E,0x00,0x36,0x60,0x67,0x60,0x63,0xE0,0x61,0xC0,0x3F,0xF0,0x1E,0x30,0x00,0x00,0x00,0x00,
    //'
    0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //(
    0x00,0x00,0x18,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x18,0x00,
    //)
    0x00,0x00,0xC0,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xC0,0x00,
    //*
    0x00,0x00,0x00,0x00,0x18,0x00,0xDB,0x00,0xFF,0x00,0x18,0x00,0x7E,0x00,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //+
    0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0xFF,0x00,0xFF,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x20,0x00,0x20,0x00,0x40,0x00,
    //-
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //.
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x00,0x00,
    ///
    0x00,0x00,0x00,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,
    //0
    0x00,0x00,0x3C,0x00,0x7E,0x00,0xE7,0x00,0xC3,0x00,0xC3,0x00,0xC3,0x00,0xC3,0x00,0xC3,0x00,0xC3,0x00,0xE7,0x00,0x7E,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //1
    0x00,0x00,0x0C,0x00,0x1C,0x00,0x3C,0x00,0x6C,0x00,0x4C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //2
    0x00,0x00,0x3C,0x00,0x7E,0x00,0xE3,0x00,0xC3,0x00,0x03,0x00,0x06,0x00,0x0E,0x00,0x1C,0x00,0x38,0x00,0x60,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //3
    0x00,0x00,0x3E,0x00,0x7F,0x00,0xC3,0x00,0x03,0x00,0x1E,0x00,0x1E,0x00,0x07,0x00,0x03,0x00,0xC3,0x00,0xE7,0x00,0x7E,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //4
    0x00,0x00,0x06,0x00,0x0E,0x00,0x0E,0x00,0x1E,0x00,0x36,0x00,0x36,0x00,0x66,0x00,0xC6,0x00,0xFF,0x00,0xFF,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //5
    0x00,0x00,0x7E,0x00,0x7E,0x00,0x60,0x00,0xE0,0x00,0xFC,0x00,0xFE,0x00,0xC7,0x00,0x03,0x00,0xC3,0x00,0xE7,0x00,0x7E,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //6
    0x00,0x00,0x3E,0x00,0x7F,0x00,0x63,0x00,0xC0,0x00,0xDC,0x00,0xFE,0x00,0xE7,0x00,0xC3,0x00,0xC3,0x00,0x63,0x00,0x7E,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //7
    0x00,0x00,0xFF,0x00,0xFF,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x38,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //8
    0x00,0x00,0x3C,0x00,0x7E,0x00,0xC3,0x00,0xC3,0x00,0xC3,0x00,0x7E,0x00,0x7E,0x00,0xC3,0x00,0xC3,0x00,0xC3,0x00,0x7E,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //9
    0x00,0x00,0x3C,0x00,0x7E,0x00,0xC6,0x00,0xC3,0x00,0xC3,0x00,0xE7,0x00,0x7F,0x00,0x3B,0x00,0x03,0x00,0xC6,0x00,0xFE,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //:
    0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //;
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x30,0x00,0x10,0x00,0x10,0x00,0x20,0x00,
    //<
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x07,0x00,0x1E,0x00,0x78,0x00,0xE0,0x00,0x78,0x00,0x1E,0x00,0x07,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //=
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //>
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0xE0,0x00,0x78,0x00,0x1E,0x00,0x07,0x00,0x1E,0x00,0x78,0x00,0xE0,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //?
    0x00,0x00,0x00,0x00,0x1E,0x00,0x3F,0x00,0x71,0x80,0x61,0x80,0x03,0x80,0x07,0x00,0x0E,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,
    //@
    0x03,0xF0,0x0F,0xFC,0x1C,0x0E,0x39,0xDE,0x37,0xFB,0x76,0x3B,0x6C,0x33,0x6C,0x33,0x6C,0x33,0x6C,0x76,0x6F,0xFC,0x37,0xB8,0x38,0x03,0x1C,0x0E,0x0F,0xFC,0x03,0xF0,
    //A
    0x00,0x00,0x0E,0x00,0x0E,0x00,0x1B,0x00,0x1B,0x00,0x1B,0x00,0x31,0x80,0x31,0x80,0x3F,0x80,0x7F,0xC0,0x60,0xC0,0x60,0xC0,0xC0,0x60,0x00,0x00,0x00,0x00,0x00,0x00,
    //B
    0x00,0x00,0x7F,0x80,0x7F,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x7F,0x80,0x7F,0xC0,0x60,0xE0,0x60,0x60,0x60,0x60,0x7F,0xC0,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
    //C
    0x00,0x00,0x0F,0x80,0x3F,0xC0,0x30,0xE0,0x60,0x60,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x60,0x30,0xE0,0x3F,0xC0,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
    //D
    0x00,0x00,0x7F,0x00,0x7F,0xC0,0x60,0xC0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0xC0,0x7F,0xC0,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //E
    0x00,0x00,0x7F,0xC0,0x7F,0xC0,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0xC0,0x7F,0xC0,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0xC0,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,
    //F
    0x00,0x00,0x7F,0x80,0x7F,0x80,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x00,0x7F,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //G
    0x00,0x00,0x0F,0x80,0x3F,0xC0,0x30,0xE0,0x60,0x60,0x60,0x00,0x60,0x00,0x63,0xE0,0x63,0xE0,0x60,0x60,0x30,0xE0,0x3F,0xC0,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
    //H
    0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x7F,0xE0,0x7F,0xE0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,
    //I
    0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //J
    0x00,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0xC3,0x00,0xE7,0x00,0x7E,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //K
    0x00,0x00,0x60,0x60,0x60,0xC0,0x61,0x80,0x63,0x00,0x66,0x00,0x6F,0x00,0x7B,0x00,0x71,0x80,0x61,0x80,0x60,0xC0,0x60,0xE0,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,
    //L
    0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x80,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
    //M
    0x00,0x00,0x70,0x70,0x70,0x70,0x78,0xF0,0x78,0xF0,0x68,0xB0,0x6D,0xB0,0x6D,0xB0,0x6D,0xB0,0x67,0x30,0x67,0x30,0x67,0x30,0x62,0x30,0x00,0x00,0x00,0x00,0x00,0x00,
    //N
    0x00,0x00,0x60,0x60,0x70,0x60,0x78,0x60,0x78,0x60,0x6C,0x60,0x66,0x60,0x66,0x60,0x63,0x60,0x61,0xE0,0x61,0xE0,0x60,0xE0,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,
    //O
    0x00,0x00,0x0F,0x00,0x3F,0xC0,0x30,0xC0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x30,0xC0,0x3F,0xC0,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //P
    0x00,0x00,0x7F,0x00,0x7F,0x80,0x61,0xC0,0x60,0xC0,0x61,0xC0,0x7F,0x80,0x7F,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //Q
    0x00,0x00,0x0F,0x00,0x3F,0xC0,0x30,0xC0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x66,0x60,0x33,0xC0,0x3F,0xC0,0x0E,0xC0,0x00,0x60,0x00,0x00,0x00,0x00,
    //R
    0x00,0x00,0x7F,0x80,0x7F,0xC0,0x60,0xE0,0x60,0x60,0x60,0xE0,0x7F,0xC0,0x7F,0x00,0x63,0x80,0x61,0xC0,0x60,0xC0,0x60,0xE0,0x60,0x70,0x00,0x00,0x00,0x00,0x00,0x00,
    //S
    0x00,0x00,0x1F,0x00,0x3F,0x80,0x61,0xC0,0x60,0xC0,0x78,0x00,0x3F,0x00,0x0F,0x80,0x01,0xC0,0x60,0xC0,0x71,0xC0,0x3F,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //T
    0x00,0x00,0xFF,0xC0,0xFF,0xC0,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //U
    0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x70,0xE0,0x3F,0xC0,0x1F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
    //V
    0x00,0x00,0xC0,0x60,0xC0,0x60,0x60,0xC0,0x60,0xC0,0x31,0x80,0x31,0x80,0x31,0x80,0x1B,0x00,0x1B,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //W
    0x00,0x00,0xC3,0x86,0xE3,0x86,0x63,0x8C,0x66,0xCC,0x66,0xCC,0x36,0xD8,0x36,0xD8,0x36,0xD8,0x1C,0x78,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x00,0x00,0x00,0x00,0x00,0x00,
    //X
    0x00,0x00,0x60,0xC0,0x71,0xC0,0x31,0x80,0x1B,0x00,0x1F,0x00,0x0E,0x00,0x0E,0x00,0x1F,0x00,0x1B,0x00,0x31,0x80,0x71,0xC0,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,
    //Y
    0x00,0x00,0xC0,0xC0,0xE1,0xC0,0x61,0x80,0x33,0x00,0x33,0x00,0x1E,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //Z
    0x00,0x00,0x7F,0x80,0x7F,0x80,0x03,0x00,0x06,0x00,0x0E,0x00,0x0C,0x00,0x18,0x00,0x38,0x00,0x30,0x00,0x60,0x00,0xFF,0x80,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
    //[
    0x00,0x00,0x78,0x00,0x78,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x78,0x00,0x78,0x00,
    //'\'
    0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x00,0x00,
    //]
    0x00,0x00,0xF0,0x00,0xF0,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0xF0,0x00,0xF0,0x00,
    //^
    0x00,0x00,0x18,0x00,0x3C,0x00,0x3C,0x00,0x66,0x00,0x66,0x00,0xC3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //_
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x80,0xFF,0x80,
    //`
    0x00,0x00,0xC0,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //a
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x7F,0x00,0x63,0x00,0x0F,0x00,0x3F,0x00,0x73,0x00,0x63,0x00,0x7F,0x00,0x3D,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
    //b
    0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x6E,0x00,0x7F,0x00,0x73,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x73,0x80,0x7F,0x00,0x6E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //c
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x3F,0x00,0x73,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x73,0x00,0x3F,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //d
    0x00,0x00,0x01,0x80,0x01,0x80,0x01,0x80,0x1D,0x80,0x3F,0x80,0x73,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x73,0x80,0x3F,0x80,0x1D,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
    //e
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x3E,0x00,0x63,0x00,0x7F,0x00,0x7F,0x00,0x60,0x00,0x73,0x00,0x3E,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //f
    0x00,0x00,0x38,0x00,0x78,0x00,0x60,0x00,0xF8,0x00,0xF8,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //g
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1D,0x80,0x3F,0x80,0x73,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x73,0x80,0x3F,0x80,0x1D,0x80,0x61,0x80,0x7F,0x80,0x3F,0x00,
    //h
    0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x6F,0x00,0x7F,0x80,0x71,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
    //i
    0x00,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //j
    0x00,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xE0,0x00,0xC0,0x00,
    //k
    0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x63,0x00,0x66,0x00,0x6C,0x00,0x7C,0x00,0x7C,0x00,0x76,0x00,0x66,0x00,0x63,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //l
    0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //m
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x70,0x7F,0xF8,0x73,0x98,0x63,0x18,0x63,0x18,0x63,0x18,0x63,0x18,0x63,0x18,0x63,0x18,0x00,0x00,0x00,0x00,0x00,0x00,
    //n
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6F,0x00,0x7F,0x80,0x71,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
    //o
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x3F,0x00,0x73,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x73,0x80,0x3F,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //p
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x00,0x7F,0x00,0x73,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x73,0x80,0x7F,0x00,0x6E,0x00,0x60,0x00,0x60,0x00,0x60,0x00,
    //q
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1D,0x80,0x3F,0x80,0x73,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x73,0x80,0x3F,0x80,0x1D,0x80,0x01,0x80,0x01,0x80,0x01,0x80,
    //r
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6C,0x00,0x7C,0x00,0x70,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //s
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x7F,0x00,0x63,0x00,0x78,0x00,0x3E,0x00,0x0F,0x00,0x63,0x00,0x7F,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //t
    0x00,0x00,0x20,0x00,0x60,0x00,0x60,0x00,0xF8,0x00,0xF8,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x78,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //u
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x63,0x80,0x7F,0x80,0x3D,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
    //v
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //w
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x18,0xC7,0x18,0x67,0x30,0x6D,0xB0,0x6D,0xB0,0x6D,0xB0,0x38,0xE0,0x38,0xE0,0x38,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,
    //x
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x77,0x00,0x36,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x36,0x00,0x77,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //y
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC1,0x80,0xC1,0x80,0x63,0x00,0x63,0x00,0x36,0x00,0x36,0x00,0x3E,0x00,0x1C,0x00,0x1C,0x00,0x18,0x00,0x78,0x00,0x70,0x00,
    //z
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x7F,0x00,0x06,0x00,0x0E,0x00,0x1C,0x00,0x38,0x00,0x30,0x00,0x7F,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    //{
    0x00,0x00,0x1C,0x00,0x3C,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0xE0,0x00,0xE0,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x3C,0x00,0x1C,0x00,
    //|
    0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,
    //}
    0x00,0x00,0xE0,0x00,0xF0,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x1C,0x00,0x1C,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0xF0,0x00,0xE0,0x00,
    //~
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x80,0x7F,0x80,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
#endif
/* end ------------------------------------------------------------------*/
